<?php


namespace app\common\service;


use app\admin\model\Chat;
use app\admin\model\ReplyInfo;
use app\admin\model\Staff;
use app\common\dao\ChatDao;
use app\common\dao\ChatLogDao;
use think\cache\driver\Redis;
use think\facade\Log;

class ReplyService
{
    public static $ic_auto_reply = "ic_auto_reply_staff"; //需要自动回复的保存的redis key

    /**
     * 自动回复
     * 规则:
     * 自动回复改成：
     * 超过5分钟客服没回复,就直接把客服设置的自动回复（全部）发送给客户,只要客户有发消息,不管客户还在不在线,5分钟后客服自动回复
     */
    public static function autoReply()
    {
//        $redis = new Redis();
//        $key = self::$ic_auto_reply;
//        # 获取集合中所有的元素
//        $staffs = $redis->sMembers($key);
//        if (empty($staffs)) return true;
//        //所有连接的员工
//        $sendListQuery = function ($chatIds, $queryData = []) {
//            $time = time();//当前时间
//            return ChatLogDao::getInChatLastDataQuery($chatIds, $queryData)
//                ->where("(create_time+300)<=$time") //写死五分钟
//                ->order('id', 'DESC')
//                ->select();
//        };
//
//        foreach ($staffs as $staff) {
//
//            //查询当前用户的自动回复信息
//            $replyData = ReplyInfo::where("staff_no", $staff)->where("create_staff_no", $staff)
//                ->where("auto", 1)->order("id")
//                ->column("info");
//
//            if (empty($replyData)) {
//
//                continue;
//            }
//
//            $staffModel = Staff::where('staff_no', $staff)->find();
//            if (empty($staffModel)) continue;
//
//            $noVipChats = ChatDao::getIsVipChatsList($staff, ChatDao::IS_VIP_NO); //所有的不是vip的列表
//            if (!empty($noVipChats)) {
//                $no_vip_chatIds = $noVipChats->column('id');
//                # 查询发送给员工的所有最后一条信息
//                $sendList = $sendListQuery($no_vip_chatIds, ['send_to' => ChatLogDao::SEND_TO_STAFF, 'staff_id' => $staffModel->id]);
//
//                if (!empty($sendList->toArray())) {
//                    //Log::info("员工:{$staff}:对应不是vip的员工为:" . json_encode($no_vip_chatIds) . ',回复数据为:' . json_encode($replyData) . date('Y-m-d H:i:s'));
//                    foreach ($sendList as $item) {
//                        $staff_id = $item['staff_id'] ?? "";//客服id
//                        $user_id = $item['user_id'] ?? "";//用户id
//                        foreach ($replyData as $replyText) { //循环需要回复的数据
//                            self::sendToMessage($user_id, $staff_id, $replyText, 0);
//                        }
//                    }
//                }
//            }
//
//
//            //发送vip用户自动回复
//            $VipChats = ChatDao::getIsVipChatsList($staff, ChatDao::IS_VIP_YES); //所有的vip用户列表
//            if (!empty($noVipChats)) {
//                $vip_chatIds = $VipChats->column('id');
//                $sendList = $sendListQuery($vip_chatIds, ['send_to' => ChatLogDao::SEND_TO_STAFF, 'staff_id' => $staffModel->id]);
//                if (!empty($sendList->toArray())) {
//                    //Log::info("员工:{$staff}:对应是vip的员工为:" . json_encode($vip_chatIds) . ',回复数据为:' . json_encode($replyData) . date('Y-m-d H:i:s'));
//                    foreach ($sendList as $item) {
//                        $staff_id = $item['staff_id'] ?? "";//客服id
//                        $user_id = $item['user_id'] ?? "";//用户id
//                        foreach ($replyData as $replyText) { //循环需要回复的数据
//                            self::sendToMessage($user_id, $staff_id, $replyText, 1);//isMen1是vip 0 不是vip
//                        }
//                    }
//                }
//            }
//        }
//        return true;

        $user_to_staff_logs = self::getAllUserToStaffLog();
        if (empty($user_to_staff_logs)) return true;
        $auto_replys = array_values($user_to_staff_logs);
        foreach ($auto_replys as $element) {//需要判断的元素
            $arr_element = json_decode($element, true);
            $user_id = $arr_element['user_id'] ?? "";
            $staff_id = $arr_element['staff_id'] ?? "";
            $is_man = $arr_element['is_man'] ?? "";
            $staff_no = $arr_element['staff_no'] ?? "";
            $date = $arr_element['date'] ?? "";
            //写死五分钟
            if ($date + 300 <= time()) {
                //执行发送程序
                //查询当前用户的自动回复信息
                $replyData = ReplyInfo::where("staff_no", $staff_no)
                    ->where("auto", 1)->order("id")
                    ->column("info");
                if (empty($replyData)) { //如果自动回复信息为空跳过此次循环且删除此次自动回复队列
                    self::delUserToStaffLog($user_id, $staff_id);
                    continue;
                }
                //执行自动回复
                foreach ($replyData as $replyText) { //循环需要回复的数据
                    self::sendToMessage($user_id, $staff_id, $replyText, $is_man);
                }
                self::delUserToStaffLog($user_id, $staff_id);//回复完毕执行删除
            }
        }
        return true;
    }

    public static function sendToMessage($user_id, $staff_id, $reply_text, $isMen)
    {
        $res = Chat::TimerToUser($user_id, $staff_id, $reply_text, $isMen);
        return true;
    }

//    /**
//     * 添加需要自动回复的工作人员
//     */
//    public static function appendAutoReplyStaffNo($staff_no)
//    {
//        $redis = new Redis();
//        $key = self::$ic_auto_reply;
//        $redis->sAdd($key, $staff_no);
//        return true;
//    }

    ############## new Api

    /**
     * 保存用户给客服发送信息记录
     */
    public static function appendUserToStaffLog($user_id, $staff_id, $staff_no, $isMan)
    {
        $redis = new Redis();
        $key = self::$ic_auto_reply;
        $redis->hmset($key, [
            $key .'_'. $user_id . '_' . $staff_id =>
                json_encode([
                    'user_id' => $user_id, //发送用户
                    'staff_id' => $staff_id, //发送给员工
                    'is_man' => $isMan,//是否是vip
                    'staff_no' => $staff_no,
                    'date' => time()//发送时间
                ])]);
    }

    /**
     * 返回所有未回复的列表
     * @return mixed
     */
    public static function getAllUserToStaffLog()
    {
        $redis = new Redis();
        $key = self::$ic_auto_reply;
//        $iterator = null;
//        $pattern = '*';
//        $count = 0;
//        //$result = $redis->hscan($key, $iterator, $pattern, $count);
        $result = $redis->hGetAll($key);
        return $result;
    }

    /**
     * 删除已经回复过的key
     * @param $user_id
     * @param $staff_id
     * @return bool
     */
    public static function delUserToStaffLog($user_id, $staff_id)
    {
        $redis = new Redis();
        $key = self::$ic_auto_reply;
        $new_key = $key .'_'. $user_id . '_' . $staff_id;
        $redis->hDel($key, $new_key);
        return true;
    }
}